﻿#ifndef GAMEPANEL_H
#define GAMEPANEL_H

#include <QMainWindow>
#include <QMap>
#include <QMouseEvent>
#include <QTimer>
#include "gamecontrol.h"
#include "cardpanel.h"
#include <QLabel>
#include "animationwindow.h"
#include "countdown.h"
#include "bgmcontrol.h"
QT_BEGIN_NAMESPACE
namespace Ui { class GamePanel; }
QT_END_NAMESPACE

class GamePanel : public QMainWindow
{
    Q_OBJECT

public:
    GamePanel(QWidget *parent = nullptr);
    ~GamePanel();
    enum AnimationType{shunzi,liandui,plane,jokerbomb,bomb,bet};
    void gameControlInit();//游戏控制类实例化
    void updateScore();//分数更新
    void initCardMap();//一副卡牌初始化
    void initButtonGroup();//叫地主等按钮初始化
    void initPlayerContext();//玩家卡牌及头像位置
    void initGameScene();//发牌场景初始化
    void initCountDown(); //初始化出牌倒计时
    void gameStatusPrecess(GameControl::GameStatus status);//处理游戏状态
    void startDispatchCard();//开始发牌
    void onDispatchCard();//定时器的处理函数
    void cardMoveStep(Player* player,int curMovePos);
    void disposCard(Player* player,Cards &cards);//处理分发得到的卡牌
    void updatePlayerCards(Player* player);//更新玩家手牌
    void onPlayerStatusChanged(Player* palyer,GameControl::PlayerStatus status);
    void onGrabLordBet(Player* player,int point,bool flag);//处理玩家抢地主
    //显示特效动画
    void showAnimation(AnimationType type,int bet=0);
    //显示出牌
    void onDisposePlayHand(Player* player,Cards &cards);
    //隐藏上轮出牌
    void hidePlayerDropCards(Player* player);
    //加载玩家头像
    QPixmap loadRoleImage(Player::Sex sex,Player::Direction direct,Player::Role role);
    //选牌操作函数
    void onCardSelect(Qt::MouseButton button);
    //处理玩家出牌
    void onUserPlayCard();
    //处理玩家过牌
    void onUserPass();
    //显示玩家最终得分界面
    void showEndingScorePanel();



protected:
    void paintEvent(QPaintEvent *event);
    void mouseMoveEvent(QMouseEvent* ev);

private:
    Ui::GamePanel *ui;
    QPixmap m_bkImage;
    GameControl* m_gameCtl;
    QVector<Player*> m_playerList;
    QMap<Card,CardPanel*> m_cardPanelMap;//整副扑克牌
    QSize m_cardSize;
    QPixmap m_cardBackImage;
    enum CardAlign{Horizontal,Vertical};
    struct PlayerContext
    {
        //1.玩家扑克牌显示的区域
        QRect cardRect;
        //2.出牌的区域
        QRect playHandRect;
        //3.扑克牌的对齐方式
        CardAlign align;
        //4.显示背面还是正面
        bool isFront;
        //5.游戏过程中的提示信息
        QLabel* info;
        //6.玩家头像
        QLabel* roleImg;
        //7.玩家刚打出的牌
        Cards lastCards;
    };
    QMap<Player*,PlayerContext> m_contextMap;

    CardPanel* m_baseCard;//发牌区扑克牌
    CardPanel* m_moveCard;//发牌过程中移动的牌
    QVector<CardPanel*> m_last3Card;//3张底牌
    QPoint m_baseCardPos;//发牌区卡牌位置
    GameControl::GameStatus m_gameStatus;//游戏状态-叫地主、出牌、获胜
    QTimer* m_timer;
    AnimationWindow* m_animation;
    //存储当前选中的一个扑克牌窗口
    CardPanel* m_curSelCard;
    //存储选中的多个扑克牌
    QSet<CardPanel*> m_selectCards;
    //用于鼠标框选功能，根据坐标查找cardpanel*对象
    QRect m_cardsRect;
    QHash<CardPanel*,QRect> m_userCards;
    //出牌倒计时窗口
    CountDown* m_countDown;
    BGMControl* m_bgm;
};
#endif // GAMEPANEL_H
